<!DOCTYPE html>
<html lang="zh-CN"><head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'><meta name='description' content='第一个 Golang 项目，第一个 github stars 数目到达 2000 的项目 🎉'><title>AUXPI对接 flicker 的一些坑</title>
    
    <link rel='canonical' href='https://sunwei.blog/p/auxpi%E5%AF%B9%E6%8E%A5-flicker-%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/'>

<link rel="stylesheet" href="/scss/style.min.css"><meta property='og:title' content='AUXPI对接 flicker 的一些坑'>
<meta property='og:description' content='第一个 Golang 项目，第一个 github stars 数目到达 2000 的项目 🎉'>
<meta property='og:url' content='https://sunwei.blog/p/auxpi%E5%AF%B9%E6%8E%A5-flicker-%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/'>
<meta property='og:site_name' content='A桑的杂货箱'>
<meta property='og:type' content='article'><meta property='article:section' content='Post' /><meta property='article:tag' content='图床' /><meta property='article:tag' content='golang' /><meta property='article:tag' content='code' /><meta property='article:tag' content='golang' /><meta property='article:published_time' content='2018-12-13T00:00:00&#43;00:00'/><meta property='article:modified_time' content='2018-12-13T00:00:00&#43;00:00'/>
<meta name="twitter:title" content="AUXPI对接 flicker 的一些坑">
<meta name="twitter:description" content="第一个 Golang 项目，第一个 github stars 数目到达 2000 的项目 🎉"></head><body class="">
        <div class="container flex on-phone--column align-items--flex-start extended article-page with-toolbar">
            <aside class="sidebar left-sidebar sticky">
    <button class="hamburger hamburger--spin" type="button" id="toggle-menu" aria-label="切换菜单">
        <span class="hamburger-box">
            <span class="hamburger-inner"></span>
        </span>
    </button>

    <header class="site-info">
        
            <figure class="site-avatar">
                

                
                    
                    <img src="/img/avatar1_huda84896c9bf23e2f48c7de4e6ccdd7e8_360249_300x300_resize_box_2.png" width="300"
                        height="300" class="site-logo" loading="lazy" alt="Avatar">
                

                <span class="emoji">🍥</span>
            </figure>
        
        <h1 class="site-name"><a href="https://sunwei.blog">A桑的杂货箱</a></h1>
        <h2 class="site-description">有时候回头看看自己做的东西，感觉充实且鬼畜😂</h2>
    </header>

    <ol class="menu" id="main-menu">
        
        
        

        <li >
            <a href='https://sunwei.blog/'>
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-home" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <polyline points="5 12 3 12 12 3 21 12 19 12" />
  <path d="M5 12v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-7" />
  <path d="M9 21v-6a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2v6" />
</svg>



                
                <span>Home</span>
            </a>
        </li>
        
        

        <li >
            <a href='https://sunwei.blog/about'>
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="7" r="4" />
  <path d="M6 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
</svg>



                
                <span>About</span>
            </a>
        </li>
        
        

        <li >
            <a href='https://sunwei.blog/archives'>
                
                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-archive" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <rect x="3" y="4" width="18" height="4" rx="2" />
  <path d="M5 8v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-10" />
  <line x1="10" y1="12" x2="14" y2="12" />
</svg>



                
                <span>Archives</span>
            </a>
        </li>
        
    </ol>
</aside>
            <main class="main full-width">
    <div id="article-toolbar">
        <a href="https://sunwei.blog" class="back-home">
            <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <polyline points="15 6 9 12 15 18" />
</svg>



            <span>Back</span>
        </a>
    </div>

    <article class="main-article">
    <header class="article-header">

    <div class="article-details">
    
    <header class="article-category">
        
            
                <a href="https://sunwei.blog/categories/%E5%88%86%E4%BA%AB/">分享</a>
            
        
            
                <a href="https://sunwei.blog/categories/%E6%8A%98%E8%85%BE/">折腾</a>
            
        
    </header>
    

    <h2 class="article-title">
        <a href="https://sunwei.blog/p/auxpi%E5%AF%B9%E6%8E%A5-flicker-%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/">AUXPI对接 flicker 的一些坑</a>
    </h2>

    
    <h3 class="article-subtitle">
        第一个 Golang 项目，第一个 github stars 数目到达 2000 的项目 🎉
    </h3>
    <footer class="article-time">
        <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="12" r="9" />
  <polyline points="12 7 12 12 15 15" />
</svg>



        <time class="article-time--published">Dec 13, 2018</time>
        
        <div style="margin-left: 20px;">
            <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user-check" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
  <circle cx="9" cy="7" r="4" />
  <path d="M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2" />
  <path d="M16 11l2 2l4 -4" />
</svg>
        </div>
        <div  class="article-time--published">
            孙玮
        </div>
        
        
    </footer></div>
</header>

    <section class="article-content">
    <blockquote>
<p>在开发 auxpi 图床的时候踩了不少坑，特别是用 flickr 的时候，简直调试到内心崩溃，我再 github 上找了一个 flickr 的第三方SDK，Go 的 SDK 并不多，而且说明很少，只能去看源码。那种简直看到心态爆炸 QAQ</p>
</blockquote>
<h2 id="multipartfile-to-osfile">multipart.File to os.File</h2>
<p>使用 beego上传文件的时候，默认接受到的文件格式是 multipart.File ，但是我发现第三方 Flickr 的 SDK所提供的文件上传类型其实是 os.File 的类型。他是用一个 <code>io.Reader</code> 做为参数传入进去的。通过阅读源代码</p>
<div class="highlight"><pre class="chroma"><code class="language-go" data-lang="go"><span class="kd">func</span> <span class="nf">UploadFile</span><span class="p">(</span><span class="nx">client</span> <span class="o">*</span><span class="nx">FlickrClient</span><span class="p">,</span> <span class="nx">path</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">optionalParams</span> <span class="o">*</span><span class="nx">UploadParams</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="nx">UploadResponse</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
	<span class="nx">file</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">os</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="nx">path</span><span class="p">)</span>
	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
		<span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
	<span class="p">}</span>
	<span class="k">defer</span> <span class="nx">file</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
	<span class="k">return</span> <span class="nf">UploadReader</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">file</span><span class="p">,</span> <span class="nx">file</span><span class="p">.</span><span class="nf">Name</span><span class="p">(),</span> <span class="nx">optionalParams</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div><p>我们可以发现，这个 <code>io.Reader </code> 其实是一个 <code>os.File</code> 的指针类型，即为 <code>*os.File</code> 我们可以直接调用 <code>UploadReader</code> 这个函数，直接将已经构造好的 <code>client</code>传入进去就可以或获得结果。</p>
<p>那么问题来了，如何将 <code>multipart.File</code> 类型转换为 <code>os.File</code> 类型,其实相当简单</p>
<div class="highlight"><pre class="chroma"><code class="language-go" data-lang="go"><span class="nx">multipartFile</span> <span class="o">:=</span> <span class="o">*</span><span class="nx">multipart</span><span class="p">.</span><span class="nx">FileHeader</span>
<span class="nx">osFile</span> <span class="o">:=</span><span class="nx">multipartFile</span><span class="p">.</span><span class="nf">Open</span><span class="p">()</span>
</code></pre></div><p><code>osFile</code> 就是我们需要的 <code>os.File</code> 类型</p>
<h2 id="oauth-flickr">Oauth Flickr</h2>
<p>其实这个玩意是最值得吐槽的，Flickr 的授权简直了，太恶心人了，真的就像是一坨💩，这是我用过最恶心人的授权。</p>
<p>弄明白它的授权需要了解下面几个比较重要的东西</p>
<ul>
<li>URL</li>
<li>Method</li>
<li>Api_key</li>
<li>Api_secret</li>
<li>Oauth_token</li>
<li>Oauth_token_secret</li>
<li>ID</li>
</ul>
<p>在构造 <code>Client</code> 的时候，<code>Client</code> 应该具有上面的字段(不包括 url)，否则就会出现各种恶心的报错。</p>
<p>其中  URL 需要签名，这个就需要参照 <code>Oauth1.0</code> 的要求去看啦，不过这玩意用起来也太恶心了……</p>
<p>第三方 SDK 在这一点做的挺不错的，具体如何实现的可以去阅读以下源代码</p>
<h2 id="flickr-sdk-update">Flickr SDK Update</h2>
<p>这里需要给这个第三方的 SDK 更新一点东西，我发现他的生成出来的 <code>Client</code> 模式的权限是 <code>delete</code> 而我们所需要的权限是 <code>write</code> 或者其他的权限，所以说权限最好可以自己设置，所以修改了一下他的代码</p>
<p>最后写了一个 Flickr 授权的一个命令行工具，有兴趣的可以看一下，就几十行代码，这个工具可以对接 <code>AUXPI</code> 图床进行使用</p>
<div class="highlight"><pre class="chroma"><code class="language-go" data-lang="go"><span class="kn">package</span> <span class="nx">main</span>

<span class="kn">import</span> <span class="p">(</span>
	<span class="s">&#34;fmt&#34;</span>

	<span class="nx">flickr</span> <span class="s">&#34;gopkg.in/masci/flickr.v2&#34;</span>
<span class="p">)</span>

<span class="kd">var</span> <span class="p">(</span>
	<span class="nx">api_key</span>    <span class="kt">string</span>
	<span class="nx">api_secret</span> <span class="kt">string</span>
	<span class="nx">method</span>     <span class="kt">string</span>
	<span class="nx">frob</span>       <span class="kt">string</span>
<span class="p">)</span>

<span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="nf">oauth</span><span class="p">()</span>
<span class="p">}</span>

<span class="kd">func</span> <span class="nf">oauth</span><span class="p">()</span> <span class="p">{</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Please input your API key &#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">api_key</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;please input your API Secret &#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scanln</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">api_secret</span><span class="p">)</span>
	<span class="nx">client</span> <span class="o">:=</span> <span class="nx">flickr</span><span class="p">.</span><span class="nf">NewFlickrClient</span><span class="p">(</span><span class="nx">api_key</span><span class="p">,</span> <span class="nx">api_secret</span><span class="p">)</span>
	<span class="nx">requestok</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">flickr</span><span class="p">.</span><span class="nf">GetRequestToken</span><span class="p">(</span><span class="nx">client</span><span class="p">)</span>
	<span class="nx">url</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">flickr</span><span class="p">.</span><span class="nf">GetAuthorizeUrl</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">requestok</span><span class="p">,</span> <span class="s">&#34;write&#34;</span><span class="p">)</span>
	<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Please Check Your Net Work,I can not connect to flickr&#34;</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;&#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Please Open the follow url to get your code!&#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;&#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">url</span><span class="p">)</span>
	<span class="kd">var</span> <span class="nx">code</span> <span class="kt">string</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Please input your Code:&#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">code</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;&lt;===Done===&gt;&#34;</span><span class="p">)</span>
	<span class="nx">_</span><span class="p">,</span> <span class="nx">errs</span> <span class="o">:=</span> <span class="nx">flickr</span><span class="p">.</span><span class="nf">GetAccessToken</span><span class="p">(</span><span class="nx">client</span><span class="p">,</span> <span class="nx">requestok</span><span class="p">,</span> <span class="nx">code</span><span class="p">)</span>
	<span class="k">if</span> <span class="nx">errs</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
		<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;Your API_KEY or API_SECRET or Your Code is error&#34;</span><span class="p">)</span>
		<span class="k">return</span>
	<span class="p">}</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;&lt;==Please Input these value to your SiteConfig.json==&gt;&#34;</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;oauth_token:&#34;</span><span class="p">,</span> <span class="nx">client</span><span class="p">.</span><span class="nx">OAuthToken</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;oauth_token_secret:&#34;</span><span class="p">,</span> <span class="nx">client</span><span class="p">.</span><span class="nx">OAuthTokenSecret</span><span class="p">)</span>
	<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">&#34;oauth_id:&#34;</span><span class="p">,</span> <span class="nx">client</span><span class="p">.</span><span class="nx">Id</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div><p>获取到的 <code>oauth_token</code>,<code>oauth_token_secret</code>,<code>oauth_id</code> 分别填入到 <code>SiteConfig.json</code> 里面，AUXPI 图床就可以快乐的使用 flickr 啦。</p>

</section>


    <footer class="article-footer">
    
    <section class="article-tags">
        
            <a href="https://sunwei.blog/tags/%E5%9B%BE%E5%BA%8A/">图床</a>
        
            <a href="https://sunwei.blog/tags/code/">code</a>
        
            <a href="https://sunwei.blog/tags/golang/">golang</a>
        
    </section>


    
    <section class="article-copyright">
        <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copyright" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
  <path stroke="none" d="M0 0h24v24H0z"/>
  <circle cx="12" cy="12" r="9" />
  <path d="M14.5 9a3.5 4 0 1 0 0 6" />
</svg>



        <span>Licensed under CC BY-NC-SA 4.0</span>
    </section>
    </footer>

    
</article>

    <aside class="related-contents--wrapper">
    
    
        <h2 class="section-title">相关文章</h2>
        <div class="related-contents">
            <div class="flex article-list--tile">
                
                    
<article class="has-image">
    <a href="https://sunwei.blog/p/%E6%9C%BA%E6%A2%B0%E5%8E%9F%E7%90%86%E5%A4%A7%E4%BD%9C%E4%B8%9A-%E5%87%B8%E8%BD%AE%E7%94%9F%E6%88%90%E5%99%A8/">
        
        
            <div class="article-image">
                <img src="/p/%E6%9C%BA%E6%A2%B0%E5%8E%9F%E7%90%86%E5%A4%A7%E4%BD%9C%E4%B8%9A-%E5%87%B8%E8%BD%AE%E7%94%9F%E6%88%90%E5%99%A8/cover_huc4bffe6863479b6bd0ad6a7dd8026253_290434_250x150_fill_box_smart1_2.png" width="250" height="150" 
                        loading="lazy" data-key="" data-hash="md5-GeMp21dEVnmnNM&#43;Gwlja7Q==">
                
            </div>
        

        <div class="article-details">
            <h2 class="article-title">机械原理大作业-凸轮生成器</h2>
        </div>
    </a>
</article>
                
                    
<article class="has-image">
    <a href="https://sunwei.blog/p/auxpi-%E5%9B%BE%E5%BA%8A/">
        
        
            <div class="article-image">
                <img src="/p/auxpi-%E5%9B%BE%E5%BA%8A/cover_hueb0766070fc2955c280311d243791276_14363_250x150_fill_box_smart1_2.png" width="250" height="150" 
                        loading="lazy" data-key="" data-hash="md5-hGw5NB8QcM8Lupc8zDCh7Q==">
                
            </div>
        

        <div class="article-details">
            <h2 class="article-title">AUXPI 图床</h2>
        </div>
    </a>
</article>
                
                    
<article class="has-image">
    <a href="https://sunwei.blog/p/%E5%B9%B4%E8%BD%BB%E4%BA%BA%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%8F%B0%E9%BB%91%E8%8B%B9%E6%9E%9C/">
        
        
            <div class="article-image">
                <img src="/p/%E5%B9%B4%E8%BD%BB%E4%BA%BA%E7%9A%84%E7%AC%AC%E4%BA%8C%E5%8F%B0%E9%BB%91%E8%8B%B9%E6%9E%9C/cover_hu9587307df3b0a528bff40458715a7575_87846_250x150_fill_box_smart1_2.png" width="250" height="150" 
                        loading="lazy" data-key="" data-hash="md5-dS0/fDtGlSnjIaP5o&#43;W0hQ==">
                
            </div>
        

        <div class="article-details">
            <h2 class="article-title">年轻人的第二台黑苹果</h2>
        </div>
    </a>
</article>
                
                    
<article class="has-image">
    <a href="https://sunwei.blog/p/docker-%E4%B8%AD-mysql-%E8%BF%9B%E8%A1%8C%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5/">
        
        
            <div class="article-image">
                <img src="/p/docker-%E4%B8%AD-mysql-%E8%BF%9B%E8%A1%8C%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5/cover_hu81200c1cba70a189fc5075fa6ae62b86_24632_250x150_fill_box_smart1_2.png" width="250" height="150" 
                        loading="lazy" data-key="" data-hash="md5-ZpeE8kpFWvQ3y9HqJ4LuQg==">
                
            </div>
        

        <div class="article-details">
            <h2 class="article-title">Docker 中 MySQL 进行主从同步</h2>
        </div>
    </a>
</article>
                
                    
<article class="">
    <a href="https://sunwei.blog/p/mac-%E5%BF%AB%E9%80%9F%E7%BC%96%E8%AF%91-swoole/">
        
        

        <div class="article-details">
            <h2 class="article-title">Mac 快速编译 swoole</h2>
        </div>
    </a>
</article>
                
            </div>
        </div>
    
</aside>

    
        
    <script src="https://utteranc.es/client.js" 
        repo="0xDkd/comment"
        issue-term="pathname"
        theme="preferred-color-scheme" 
        
        crossorigin="anonymous" 
        async>
</script>

<style>
    .utterances {
        max-width: unset;
    }
</style>

    

    <footer class="site-footer">
    <section class="copyright">&copy; 2020 A桑的杂货箱</section>
    <section class="powerby">
        Built with <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> <br />
        Theme <b><a href="https://github.com/CaiJimmy/hugo-theme-stack" target="_blank" rel="noopener" data-version="1.0.5">Stack</a></b> designed by
        <a href="https://jimmycai.com" target="_blank" rel="noopener">Jimmy</a>
    </section>
</footer>
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true" style="display:none">

    
    <div class="pswp__bg"></div>

    
    <div class="pswp__scroll-wrap">

        
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                
                
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>
            </main>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/node-vibrant@3.1.5/dist/vibrant.min.js"
    integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g=" crossorigin="anonymous"></script><script type="text/javascript" src="/ts/main.js" defer></script>
<script>
    (function () {
        const customFont = document.createElement('link');
        customFont.href = "https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&display=swap";

        customFont.type = "text/css";
        customFont.rel = "stylesheet";

        document.head.appendChild(customFont);
    }());
</script>
<link rel="stylesheet" href="/css/highlight/light.min.css" media="(prefers-color-scheme: light)">
<link rel="stylesheet" href="/css/highlight/dark.min.css" media="(prefers-color-scheme: dark)">

    </body>
</html>
